﻿using System;
using System.Diagnostics;

namespace H.Logs
{
    /// <summary>
    /// 日志接口
    /// </summary>
    public abstract class ILog
    {
        /// <summary>IHLog
        /// 打印一条调试日志
        /// </summary>
        /// <param name="message">调试日志信息</param>
        [Conditional("DEBUG")]
        public abstract void Debug(string message);

        /// <summary>
        /// 打印一条调试日志,并打印一个对象,非调用ToString方法打印对象,可打印数组,
        /// 注:非必要不要使用此日志接口,因为获取obj内容是同步的,容易造成时延
        /// </summary>
        /// <param name="message">调试日志信息</param>
        /// <param name="obj">被打印的对象,此对象将被反射后打印所有的getter和字段值,只打印一层,不打印更深层次</param>
        [Conditional("DEBUG")]
        public abstract void Debug(string message, object obj);

        /// <summary>
        /// 以调试等级打印日志,适用于一些不会影响运行,正式发布时又要去除的日志信息
        /// </summary>
        /// <param name="message">调试日志信息</param>
        /// <param name="exception">需要被打印的异常信息</param>
        [Conditional("DEBUG")]
        public abstract void Debug(string message, Exception exception);

        /// <summary>
        /// 以调试等级打印日志,并打印当前调用堆栈
        /// </summary>
        /// <param name="message">调试日志信息</param>
        /// <param name="stackTrace">需要被打印的堆栈信息</param>
        [Conditional("DEBUG")]
        public abstract void Debug(string message, StackTrace stackTrace);

        /// <summary>
        /// 显示关键点信息,这个信息主要是为了能够在查看日志时方便定位错误位置,这些日志在发布版也会进行保留
        /// </summary>
        /// <param name="message">关键点信息</param>
        public abstract void Info(string message);

        /// <summary>
        /// 显示一条警告信息
        /// </summary>
        /// <param name="message">需要显示的警告信息</param>
        public abstract void Warn(string message);

        /// <summary>
        /// 打印一条严重错误信息
        /// </summary>
        /// <param name="message">需要显示的错误信息</param>
        public abstract void Error(string message);

        /// <summary>
        /// 打印一条严重错误信息,并输出一个异常信息
        /// </summary>
        /// <param name="message">需要显示的错误信息</param>
        /// <param name="exception">需要打印的异常信息</param>
        public abstract void Error(string message, Exception exception);

        /// <summary>
        /// 打印一条严重错误信息,并打印一个堆栈信息
        /// </summary>
        /// <param name="message">需要显示的错误信息</param>
        /// <param name="stackTrace">需要打印的堆栈信息</param>
        public abstract void Error(string message, StackTrace stackTrace);

        /// <summary>
        /// 打印一条严重错误信息,并打印一个异常和一个堆栈信息
        /// </summary>
        /// <param name="message">需要显示的错误信息</param>
        /// <param name="exception">需要打印的异常信息</param>
        /// <param name="stackTrace">需要打印的堆栈信息</param>
        public abstract void Error(string message, Exception exception, StackTrace stackTrace);
    }
}
